home *** CD-ROM | disk | FTP | other *** search
- /*==============================================================================
-
- FICHERO: EMS.C
-
- AUTOR: ANTONIO LADESA JURADO
-
- FECHA: 24/6/94
-
- DESCRIPCION:
-
- Fichero que contiene las estructuras, constantes, variables y funciones
- internas y externas para la gestión de memoria EMS.
-
- ==============================================================================*/
-
-
- /*---- MODULOS USADOS --------------------------------------------------------*/
-
- #include <stdio.h>
- #include <io.h>
- #include <dos.h>
- #include <fcntl.h>
-
- #include "ems.h"
-
- /*---- VARIABLES LOCALES -----------------------------------------------------*/
-
- static char *EMS_marco_pagina;
- static int EMS_paginas_totales;
- static int EMS_paginas_libres;
-
- /*---- CODIFICACION DE LAS FUNCIONES OFRECIDAS -------------------------------*/
-
-
- /*---- FUNCION: extern int EMSmemIniciar(void) ---------------------------------
-
- Descripción:
-
- Esta función inicializa la memoria EMS.
- Tambien actualiza el marco de página.
-
- Retorno:
-
- - 1 si la inicializa.
- - 0 si no.
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern int EMSmemIniciar(void)
- {
- if(EMSmemDriver())
- if(EMSHardware())
- {
- EMS_marco_pagina = EMSMarcoPagina();
- return(1);
- }
- return(0);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
-
- /*---- FUNCION: extern int EMSmemDriver(void) ----------------------------------
-
- Descripción:
-
- Esta función detecta si se ha instalado el driver de EMS.
-
- Retorno:
-
- - 1 si está instalado.
- - 0 si no.
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern int EMSmemDriver(void)
- {
- int fichero;
- union REGS rg;
-
- if((fichero=open("EMMXXXX0",O_RDONLY,&fichero))== -1)
- return(0);
- rg.h.ah = 0x44;
- rg.h.al = 0x00;
- rg.x.bx = fichero;
- int86(0x21,&rg,&rg);
- close(fichero);
- if(rg.x.cflag)
- return(0);
- if(rg.x.dx & 0x80)
- return(1);
- else
- return(0);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
- /*---- FUNCION: extern int EMSHardware(void) -----------------------------------
-
- Descripción:
-
- Esta función detecta si existe una tarjeta EMS instalada
- o un driver.
-
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern int EMSHardware(void)
- {
- union REGS rg;
-
- rg.h.ah=0x40;
- int86(0x67,&rg,&rg);
- if(rg.h.ah==0)
- return(1);
- else
- return(0);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
-
- /*---- FUNCION: extern int EMSmemTotal(void) -----------------------------------
-
- Descripción:
-
- Esta función devuelve el número total de páginas.
-
- Retorno:
-
- Número de páginas.
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern int EMSmemTotal(void)
- {
- union REGS rg;
-
- rg.h.ah = 0x42;
- int86(0x67,&rg,&rg);
- if(rg.x.cflag)
- return(-1);
- EMS_paginas_totales = rg.x.dx;
- return(EMS_paginas_totales);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
-
- /*---- FUNCION: extern int EMSmemLibre(void) -----------------------------------
-
- Descripción:
-
- Esta función devuelve el numero de paginas libres.
-
- Retorno:
-
- Número de páginas libres.
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern int EMSmemLibre(void)
- {
- union REGS rg;
-
- rg.h.ah = 0x42;
- int86(0x67,&rg,&rg);
- if(rg.x.cflag)
- return(-1);
- EMS_paginas_libres = rg.x.bx;
- return(EMS_paginas_libres);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
-
- /*---- FUNCION: extern char *EMSMarcoPagina(void) ------------------------------
-
- Descripción:
-
- Esta función devuelve el marco de página EMS.
-
- Retorno:
-
- Ventana EMS.
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern char *EMSMarcoPagina(void)
- {
- union REGS rg;
-
- rg.h.ah=0x41;
- int86(0x67,&rg,&rg);
- if(rg.h.ah != 0)
- return(NULL);
- else
- return(MK_FP(rg.x.bx,0));
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
-
- /*---- FUNCION: extern unsigned int EMSmemReservar(int n) ----------------------
-
- Descripción:
-
- Esta función reserva 1 o varias páginas de memoria EMS.
-
- Parámetros:
-
- n : número de páginas a reservar.
-
- Retorno:
-
- - Gestor EMS.
- - 0 si hubo error.
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern unsigned int EMSmemReservar(int n)
- {
- union REGS rg;
-
- if(n > EMSmemLibre())
- return(0);
- rg.h.ah = 0x43;
- rg.x.bx = n;
- int86(0x67,&rg,&rg);
- if(rg.h.ah)
- return(0);
- else
- {
- EMSmemLibre();
- return(rg.x.dx);
- }
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
-
- /*---- FUNCION: extern int EMSmemLiberar(unsigned int h) -----------------------
-
- Descripción:
-
- Esta función libera memoria EMS reservada anteriormente.
-
- Parámetros:
-
- unsigned int h : gestor de memoria EMS a liberar
-
- Retorno:
-
- - 1 si liberó.
- - 0 si hubo error.
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
- extern int EMSmemLiberar(unsigned int h)
- {
- union REGS rg;
-
- rg.h.ah=0x45;
- rg.x.dx=h;
- int86(0x67,&rg,&rg);
- if(rg.h.ah == 0)
- {
- EMSmemLibre();
- return(1);
- }
- else
- return(0);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/
-
-
- /*---- FUNCION: extern int EMSmemMapear(unsigned int h, --------------
- int pagina_fisica,
- int pagina_logica) ) -------------------
-
- Descripción:
-
- Esta función mapea pagina logica a pagina fisica.
-
- Parámetros:
-
- unsigned int h : gestor de memoria EMS
- int pagina_fisica : página física
- int pagina_logica : página lógica
-
- Retorno:
-
- - 1 si hubo éxito.
- - 0 si hubo error.
-
- ---- CODIGO: -----------------------------------------------------------------*/
-
-
- int EMSmemMapear(unsigned int h,int pagina_fisica,int pagina_logica)
- {
- union REGS rg;
-
- rg.h.ah = 0x44;
- rg.h.al = pagina_fisica;
- rg.x.bx = pagina_logica;
- rg.x.dx = h;
- int86(0x67,&rg,&rg);
- if(rg.h.ah != 0)
- return(0);
- else
- return(1);
- }
-
- /*---- FIN FUNCION -----------------------------------------------------------*/